package org.bluedream.core.module.base;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.bluedream.comm.base.TreeServiceImpl;
import org.bluedream.comm.utils.EmptyUtil;
import org.bluedream.comm.utils.ReflexUtil;
import org.bluedream.core.utils.UserUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName OrgTreeServiceImpl
 * @Description TODO
 * @Author Administrator
 * @Data 2021/11/30 11:04
 * @Version
 */
@Transactional(
        readOnly = true
)
public class OrgTreeServiceImpl<M extends BaseMapper<T>, T> extends TreeServiceImpl<M , T> {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 获取树结构数据
     * @param isShowCode 是否显示编码（true or 1：显示在左侧；2：显示在右侧；false or null：不显示）
     * @return
     */
    public List<Map<String , Object>> treeData(String excludeCode , String isShowCode , T entity) {
        Map<String , Object> search = new HashMap<>();
        try {
            setLoginOrgCode2SearchMap(entity , search);
            return super.treeData(excludeCode , isShowCode , entity , search);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 封装findPage
     * @param entity
     * @param search  Map中的key：";"为保留关键字，拆分数组，仅支持最大长度2的数组，
     *                下标0：QueryWrapper查询条件中的列名(支持多表关联查询的表别名 + 列名方式，需要dao层接口支持)
     *                下标1： QueryWrapper中不同的查询条件，eq：等于，ge：大于等..... todo：请自行完善Mybatis eq、ne、gt、lt、ge、le等
     *                Map中的value：QueryWrapper需要查询的值
     * @param args  QueryWrapper中order by 排序数组
     * @return
     */
    public IPage<T> findPage(T entity , Map<String , Object> search , String... args){
        setLoginOrgCode2SearchMap(entity , search);
        return super.findPage(entity , search , args);
    }

    private void setLoginOrgCode2SearchMap(T entity , Map<String , Object> search){
        String tableName = entity.getClass().getSimpleName();
        search.put("org_code;eq" , UserUtil.getLoginOrgCode());
    }

    @Override
    public boolean save(T entity) {
        Class<?>[] clazz = {String.class};
        ReflexUtil.invoke(entity , "setOrgCode" , clazz , UserUtil.getLoginOrgCode());
        return super.save(entity);
    }
}